package com.balance.service.regist.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.RandomUtil;
import com.balance.pojo.LoginDTO;
import com.balance.pojo.common.CommonResult;
import com.balance.pojo.sys.SysUser;
import com.balance.service.regist.IRegisterService;
import com.balance.service.sys.ISysUserService;
import com.balance.utils.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @Title: RegisterServiceImpl
 * @Author 小东
 * @Package com.balance.service.regist.impl
 * @Date 2025/4/1 15:26
 * @description: 注册实现类
 */
@Service
public class RegisterServiceImpl implements IRegisterService {

    // 定义一个对redis模板做了字符串序例化的实例对象
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private ISysUserService sysUserService;

    /**
     * 生成验证码
     * @param phone：电话号码
     * @return
     */
    @Override
    public CommonResult<String> checkPhoneAndCode(String phone) {
        // 校验手机号
        if (phone.length() != 11) return CommonResult.error("电话号码输入错误");
        // 生成验证码
        String code = RandomUtil.randomNumbers(6);
        // 保存验证码到redis
        // 以分钟为单位，设置过期时间
        stringRedisTemplate.opsForValue().set(RedisUtil.LOGIN_CODE_KEY + phone, code, RedisUtil.LOGIN_CODE_TTL, TimeUnit.MINUTES);
        System.out.println(stringRedisTemplate.getClientList());
        // 发送验证吗
        return CommonResult.success("验证码为：" + code + "，验证码时间有效期为" + RedisUtil.LOGIN_CODE_TTL + "分钟，请尽快输入");
    }

    /**
     * 使用用户名登录生成token
     * @param sysUser
     * @return
     */
    @Override
    public CommonResult<String> checkUsernameAndPwd(SysUser sysUser) {
        // 判断当前输入信息是否为空
        if (sysUser == null) {
            return CommonResult.error("请输入正确的账号或密码");
        }
        // 查询相关信息
        SysUser sysUserByUsername = sysUserService.getSysUserByUsername(sysUser);
        // 判断相关信息是否存在
        if(sysUserByUsername == null){
            return CommonResult.error("账号或密码错误");
        }
        // 登录
        StpUtil.login(sysUserByUsername.getId());
        return CommonResult.success(StpUtil.getTokenValue());
    }

    /**
     * 使用手机号码登录获取token
     * @param loginDTO
     * @return
     */
    @Override
    public CommonResult checkPhoneCode(LoginDTO loginDTO) {
        // 校验手机号格式
        if (loginDTO.getPhone().length() != 11) return CommonResult.error("电话号码输入错误");
        String redisKey = stringRedisTemplate.opsForValue().get(RedisUtil.LOGIN_CODE_KEY + loginDTO.getPhone());
        System.out.println(redisKey);
        // 判断redis存入的验证码是否于输入的电话号码是否匹配
        if(!Objects.equals(redisKey, loginDTO.getCode())) {
            return CommonResult.error("验证码失败");
        }
        // 校验当前手机号是否已经注册过
        List<SysUser> userByMobile = sysUserService.getUserByMobile(loginDTO.getPhone());
        // 添加随机用户数据（使用手机号登录，默认数据）
        SysUser sysUser = new SysUser(
                RandomUtil.randomString(10),
                RandomUtil.randomStringUpper(11),
                RedisUtil.AUTO_GENERATOR_STR+RandomUtil.randomString(10),
                loginDTO.getPhone()
        );
        // 判断数据是否存在
        if(userByMobile.isEmpty()){
            int total = sysUserService.insertUser(sysUser);
            // 判断是否插入数据成功
            if(total == 1){
                // 登录
                StpUtil.login(sysUser.getId());
                return CommonResult.success(StpUtil.getTokenValue());
            }else{
                return CommonResult.error("添加失败");
            }
        }
        //  用户存在的情况
        SysUser existUser = userByMobile.get(0);
        StpUtil.login(existUser.getId());
        return CommonResult.success(StpUtil.getTokenValue());
    }
}
